🧱 Зависимости и улучшение SPEC-файла
🎯 Цель раздела
В этом разделе вы:
- научитесь описывать зависимости пакета;
- узнаете, как работать со скриптовыми секциями (
%post,%pre,%preun,%trigger); - освоите лучшие практики для чистого и поддерживаемого SPEC-файла.
📦 Зависимости пакета
1. BuildRequires
BuildRequires — пакеты, необходимые во время сборки. Они не попадут в итоговый RPM, но без них сборка не состоится.
BuildRequires: gcc
BuildRequires: make
BuildRequires: glibc-devel
2. Requires
Requires — пакеты, которые должны быть установлены во время работы программы.
Requires: bash
Requires: libX11
3. Автоматическое определение зависимостей
RPM способен сам определить зависимости на основе импортируемых библиотек. Тем не менее, ручное указание требуется, если:
- пакет использует нестандартные пути,
- библиотека не имеет
.soсимлинков, - требуется конкретная версия.
Requires: python3 >= 3.10
🧩 Пример комбинированных зависимостей
BuildRequires: gcc, make, pkgconfig(glib-2.0)
Requires: glib2 >= 2.56
Проверить зависимости можно командой:
rpm -qpR RPMS/x86_64/hello-1.0-1.x86_64.rpm
⚙️ Скриптовые секции SPEC-файла
SPEC позволяет выполнять скрипты при установке, обновлении и удалении пакета.
| Секция | Когда выполняется | Пример |
|---|---|---|
%pre | До установки | Создание пользователя, каталогов |
%post | После установки | Запуск сервиса, обновление кэшей |
%preun | До удаления | Остановка службы |
%postun | После удаления | Очистка временных данных |
%trigger | При обновлении или пересечении с другим пакетом | Кастомная логика обновлений |
Пример:
%post
echo "Приложение hello установлено!"
%preun
echo "Удаляется hello..."
🧰 Пример установки службы через systemd
Requires(post): systemd
Requires(preun): systemd
Requires(postun): systemd
%post
%systemd_post hello.service
%preun
%systemd_preun hello.service
%postun
%systemd_postun_with_restart hello.service
💡 Эти макросы упрощают работу с systemd и автоматизируют включение/отключение сервисов.
🧾 Улучшение SPEC-файла
Хорошо написанный SPEC:
- Читается человеком;
- Содержит минимально необходимое;
- Не дублирует команды, уже выполняемые по умолчанию;
Пример “чистого” SPEC
Name: hello
Version: 1.1
Release: 2%{?dist}
Summary: Simple Hello World
License: MIT
URL: https://example.com/hello
Source0: %{name}-%{version}.tar.gz
BuildRequires: gcc, make
Requires: glibc
%description
A simple demonstration of package building for ROSA Linux.
%prep
%autosetup -n %{name}-%{version}
%build
%make_build
%install
%make_install
%files
%license LICENSE
%doc README.md
%{_bindir}/hello
%changelog
* Fri Oct 31 2025 Sergey Braumann <sergeybraumann@gmail.com> 1.1-2
- Cleaned up SPEC file and added documentation references
🧠 Макросы упрощающие жизнь
| Макрос | Эквивалент |
|---|---|
%autosetup | Распаковка + применение патчей |
%make_build | make -O -j$(nproc) |
%make_install | make install DESTDIR=%{buildroot} |
%license | Пометка файла лицензии |
%doc | Пометка документации |
⚙️ Использование стандартных макросов делает SPEC-файл универсальным и совместимым с ABF.
🧩 Проверка на соответствие стандартам
Используйте rpmlint:
rpmlint SPECS/hello.spec RPMS/x86_64/hello-1.1-2.x86_64.rpm
Типичные предупреждения:
W: no-documentation— нет документации;E: non-standard-dir-in-usr— неправильный путь установки;W: no-%build-section— отсутствует сборка.
✅ Исправляйте все ошибки (E) и большинство предупреждений (W).
🧠 Мини-тест для самопроверки
| Вопрос | Ответ |
|---|---|
Чем отличаются Requires и BuildRequires? | Первое — для установки, второе — для сборки |
Для чего нужны секции %post и %preun? | Для выполнения действий при установке и удалении |
| Как проверить зависимости готового RPM? | rpm -qpR <путь>.rpm |
Что делает макрос %make_install? | Устанавливает файлы в %{buildroot} |
Что проверяет rpmlint? | Соответствие пакета правилам качества |
🧭 Итого
Теперь вы:
- умеете описывать зависимости пакета;
- знаете, как использовать скриптовые секции;
- владеете приёмами “чистого” SPEC-файла;
- готовы к следующему шагу — отладке и устранению ошибок сборки.
Следующий документ — “Отладка и устранение ошибок сборки”, где вы научитесь анализировать логи, разбираться с ошибками rpmbuild и использовать инструменты mock и chroot.